package com.example.myapplicationthirteen.receivers;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * 本地广播接收器 - 按【作用范围】分类的广播实现
 * 
 * 核心特性：
 * 1. 仅应用内传播：广播不会泄露给其他应用，提高安全性
 * 2. 更高效：内部使用Handler机制，无需跨进程通信
 * 3. 线程安全：可以在任何线程发送和接收
 * 4. 只能动态注册：必须通过代码注册和注销，生命周期可控
 * 5. 无需权限：应用内部通信不需要权限声明
 * 
 * 适用场景：
 * - 应用内组件通信：Activity、Fragment、Service之间的消息传递
 * - 登录状态同步：用户登录/登出状态的应用内传播
 * - 数据更新通知：数据库变化、网络请求完成等内部事件
 * - UI状态同步：不同界面间的状态同步
 * 
 * 遵循核心原则："能用地播不用全局"，优先使用本地广播确保安全和性能
 */
public class LocalBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "LocalBroadcastReceiver";
    private final String receiverName;
    private OnLocalBroadcastReceivedListener listener;

    /**
     * 本地广播接收监听器接口
     */
    public interface OnLocalBroadcastReceivedListener {
        void onLocalBroadcastReceived(String receiverName, String action, String data);
    }

    /**
     * 构造函数
     * @param name 接收器名称，用于标识不同的接收器实例
     */
    public LocalBroadcastReceiver(String name) {
        this.receiverName = name;
    }

    /**
     * 设置本地广播接收监听器
     * @param listener 监听器实例
     */
    public void setOnLocalBroadcastReceivedListener(OnLocalBroadcastReceivedListener listener) {
        this.listener = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            // 验证intent不为空
            if (intent == null) {
                Log.e(TAG, receiverName + " 收到空本地广播");
                return;
            }

            // 获取广播Action和数据
            String action = intent.getAction();
            String data = intent.getStringExtra("data");
            
            // 获取所有附加数据用于详细日志
            Bundle extras = intent.getExtras();
            StringBuilder extrasInfo = new StringBuilder();
            if (extras != null) {
                for (String key : extras.keySet()) {
                    extrasInfo.append(key).append("=")
                            .append(extras.get(key)).append(", ");
                }
                if (extrasInfo.length() > 0) {
                    extrasInfo.setLength(extrasInfo.length() - 2); // 移除最后的逗号和空格
                }
            }

            // 详细日志记录
            Log.d(TAG, receiverName + " 收到本地广播: Action=" + action 
                    + ", 数据=" + data
                    + (extrasInfo.length() > 0 ? ", 所有参数: {" + extrasInfo + "}" : ""));

            // 通过监听器通知外部
            if (listener != null) {
                listener.onLocalBroadcastReceived(receiverName, action, data);
            }

            // 本地广播通常不需要截断（但使用LocalBroadcastManager.sendBroadcastSync时相当于有序广播）
            // 这里可以执行其他业务逻辑，如更新UI、启动服务等
            
        } catch (Exception e) {
            // 异常捕获，防止接收器崩溃导致应用问题
            Log.e(TAG, receiverName + " 处理本地广播时发生错误: " + e.getMessage(), e);
        }
    }
}